package com.example.demo.utils;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.HorizontalAlignment;

/**
 * @author 谢辉
 * @Classname ExcelUtil
 * @Description TODO
 * @Date 2020/12/9 18:29
 * Jakarta POI HSSF API组件:
 * HSSF（用于操作Excel的组件）提供给用户使用的对象在rg.apache.poi.hssf.usermodel包中,主要部分包括Excel对象，
 * 样式和格式，有以下几种常用的对象：
 * <p>
 * 常用组件：
 * <p>
 * HSSFWorkbook     excel的文档对象
 * <p>
 * HSSFSheet            excel的表单
 * <p>
 * HSSFRow               excel的行
 * <p>
 * HSSFCell                excel的格子单元
 * <p>
 * HSSFFont               excel字体
 * <p>
 * 样式：
 * <p>
 * HSSFCellStyle         cell样式
 * <p>
 * 基本操作步骤：
 * 一个Excel文件对应一个workbook，一个workbook中有多个sheet组成，一个sheet是由多个行(row)和列(cell)组成。
 * 那么我们用poi要导出一个Excel表格的正确顺序应该是：
 * <p>
 * 1、用HSSFWorkbook打开或者创建“Excel文件对象”
 * <p>
 * 2、用HSSFWorkbook对象返回或者创建Sheet对象
 * <p>
 * 3、用Sheet对象返回行对象，用行对象得到Cell对象
 * <p>
 * 4、对Cell对象读写。
 * <p>
 * 5、将生成的HSSFWorkbook放入HttpServletResponse中响应到前端页面
 */
public class ExcelUtil {

    /**
     * 导出Excel
     *
     * @param sheetName sheet名称
     * @param title     标题
     * @param values    内容
     * @param wb        HSSFWorkbook对象
     * @return
     */
    public static HSSFWorkbook getHSSFWorkbook(String sheetName, String[] title, String[][] values, HSSFWorkbook wb) {

        // 第一步，创建一个HSSFWorkbook，对应一个Excel文件
        if (wb == null) {
            wb = new HSSFWorkbook();
        }

        // 第二步，在workbook中添加一个sheet,对应Excel文件中的sheet
        HSSFSheet sheet = wb.createSheet(sheetName);

        // 第三步，在sheet中添加表头第0行,注意老版本poi对Excel的行数列数有限制
        HSSFRow row = sheet.createRow(0);

        // 第四步，创建单元格，并设置值表头 设置表头居中
        HSSFCellStyle style = wb.createCellStyle();
        // 水平居中
        style.setAlignment(HorizontalAlignment.CENTER);
        // 垂直居中
        // style.setVerticalAlignment(VerticalAlignment.CENTER);

        //声明列对象
        HSSFCell cell = null;

        //创建标题
        for (int i = 0; i < title.length; i++) {
            cell = row.createCell(i);
            cell.setCellValue(title[i]);
            cell.setCellStyle(style);
        }

        //创建内容
        for (int i = 0; i < values.length; i++) {
            row = sheet.createRow(i + 1);
            for (int j = 0; j < values[i].length; j++) {
                //将内容按顺序赋给对应的列对象
                row.createCell(j).setCellValue(values[i][j]);
            }
        }
        return wb;
    }
}
